// 关系户扣减 更新数据
function onAssociates(info, item, type, amount) {
  switch (info.settlementType) {
    case 'STANDARD': // 标准佣金
      return onAssociates_bz(item, type, amount);
    case 'DEPOSIT': // 保证金佣金
      return onAssociates_bz(item, type, amount, 'bzj');
    case 'SKIP_POINT': break; // 跳点佣金
    case 'PREMIUM': break; // 溢价佣金
    case 'STANDARD_AND_DEPOSIT': // 标准+保证金佣金
      return onAssociates_bz(item, type, amount, 'bz_bzj');
    case 'STANDARD_AND_PREMIUM': break; // 标准+溢价佣金
    default: break;
  }
}

function onAssociates_bz(item, type, amount, flag = 'bz') {
  let obj = {}
  // 计算 更新本次应结代理费、本次可结代理费、关系户扣减
  if (flag === 'bzj') {
    obj = calcShouldAgentCost_bzj(item, type, amount, flag)
  } else {
    obj = calcShouldAgentCost(item, type, amount, flag)
  }
  return obj
}



// 本次结算总销调整 更新数据
function onSettlement(info, item) {
  switch (info.settlementType) {
    case 'STANDARD': // 标准佣金
      return onRate_bz(info, item);
    case 'DEPOSIT': break; // 保证金佣金
    case 'SKIP_POINT': break; // 跳点佣金
    case 'PREMIUM': break; // 溢价佣金
    case 'STANDARD_AND_DEPOSIT': // 标准+保证金佣金
      return onRate_bz(info, item, 'bz_bzj');
    case 'STANDARD_AND_PREMIUM': break; // 标准+溢价佣金
    default: break;
  }
}



// 费率调整 更新数据
function onRate(info, item) {
  switch (info.settlementType) {
    case 'STANDARD': // 标准佣金
      return onRate_bz(info, item);
    case 'DEPOSIT': // 保证金佣金
      return onRate_bzj(info, item);
    case 'SKIP_POINT': break; // 跳点佣金
    case 'PREMIUM': break; // 溢价佣金
    case 'STANDARD_AND_DEPOSIT': // 标准+保证金佣金
      return onRate_bz(info, item, 'bz_bzj');
    case 'STANDARD_AND_PREMIUM': break; // 标准+溢价佣金
    default: break;
  }
}

function onRate_bz(info, item, flag = 'bz') {
  let obj = {}
  // 计算 更新交房保证金
  obj.depositAmount = item.depositAmount = calcDepositAmount(item)
  /** 
   * 计算 本次结算交房保证金（标准+保证金结算）:
   * =>已结佣或没有交房日期: 本次结算交房保证金=0
   * =>本次结算交房保证金=交房保证金
   */
  if (flag === 'bz_bzj') {
    if (item.handoverStatus || !item.dealRoomDate) {
      obj.settlementDepositAmount = item.settlementDepositAmount = 0
    } else {
      obj.settlementDepositAmount = item.settlementDepositAmount = item.depositAmount
    }
  }
  // 计算 更新本次应结代理费、本次可结代理费、关系户扣减
  obj = {
    ...obj,
    ...calcShouldAgentCost(item, info.reduceType, info.reduceAmount, flag)
  }
  return obj
}

function onRate_bzj(info, item) {
  let obj = {}
  // 计算 更新交房保证金
  obj.depositAmount = item.depositAmount = calcDepositAmount_bzj(item)
  // 计算 更新本次应结代理费、本次可结代理费、关系户扣减
  obj = {
    ...obj,
    ...calcShouldAgentCost_bzj(item, info.reduceType, info.reduceAmount)
  }
  return obj
}



// 调整值调整 更新数据
function onAdjust(info, item) {
  switch (info.settlementType) {
    case 'STANDARD': // 标准佣金 本次可结代理费=本次应结代理费+调整值
      return {
        actualAgentCost: dealPrecision(Number(item.shouldAgentCost) + Number(item.adjustAmount))
      };
    case 'DEPOSIT': // 保证金佣金 本次可结代理费=本次应结代理费+调整值
      return {
        actualAgentCost: dealPrecision(Number(item.shouldAgentCost) + Number(item.adjustAmount))
      };
    case 'SKIP_POINT': break; // 跳点佣金
    case 'PREMIUM': break; // 溢价佣金
    case 'STANDARD_AND_DEPOSIT': // 标准+保证金佣金 本次可结代理费=本次应结代理费+本次结算交房保证金+调整值
      return {
        actualAgentCost: dealPrecision(Number(item.shouldAgentCost) + Number(item.settlementDepositAmount) + Number(item.adjustAmount))
      };
    case 'STANDARD_AND_PREMIUM': break; // 标准+溢价佣金
    default: break;
  }
}



// 本次交房保证金（保证金结算）调整 更新数据
function onDeposit(info, item) {
  // 计算 更新本次应结代理费、本次可结代理费、关系户扣减
  let obj = {
    ...calcShouldAgentCost_bzj(item, info.reduceType, info.reduceAmount)
  }
  return obj
}



// 本次结算交房保证金（标准+保证金结算）调整 更新数据
function onSettlementDeposit(info, item) {
  // 计算 更新本次可结代理费=本次应结代理费+本次结算交房保证金+调整值
  let obj = {
    actualAgentCost: dealPrecision(Number(item.shouldAgentCost) + Number(item.settlementDepositAmount) + Number(item.adjustAmount))
  }
  return obj
}



/** 
 * 计算交房保证金：
 * =>基础代理费为比例：交房保证金=本次结算总销*代理费率*交房保证金比例
 * =>基础代理费为固定金额：交房保证金=本次结算总销/签约总价*固定金额*交房保证金比例
 */
function calcDepositAmount(item) {
  let num = 0
  if (item.baseAgentType == '1') {
    num = Number(item.settlementAmount) * (Number(item.baseAgentCost)/100) * (Number(item.depositPer)/100)
  } else {
    num = Number(item.settlementAmount) / Number(item.totalPrice) * Number(item.baseAgentCost) * (Number(item.depositPer)/100)
  }
  return dealPrecision(num)
}

/** 
 * 保证金结算-计算交房保证金：
 * =>交房结佣状态为已结佣：本次交房保证金 = 0
 * =>交房结佣状态为未结佣：
 *   =>基础代理费为比例：交房保证金=签约总价*代理费率*交房保证金比例
 *   =>基础代理费为固定金额：交房保证金=固定金额*交房保证金比例
 *   =>联代分佣为是：交房保证金=各规则下计算的交房保证金*联代分佣比例
 */
function calcDepositAmount_bzj(item) {
  let num = 0
  if (!item.handoverStatus) {
    if (item.baseAgentType == '1') {
      num = Number(item.totalPrice) * (Number(item.baseAgentCost)/100) * (Number(item.depositPer)/100)
    } else {
      num = Number(item.baseAgentCost) * (Number(item.depositPer)/100)
    }
    if (item.isInsteadOfWorkers) num = num * (Number(item.workersRatio)/100)
  }
  return dealPrecision(num)
}



/** 
 * 计算本次应结代理费、本次可结代理费、关系户扣减：
 * 1、本次应结代理费、关系户扣减
 *  =>基础代理费为比例：本次应结代理费=本次结算总销*本次代理费率*(1-交房保证金比例)
 *  =>基础代理费为固定金额：本次应结代理费=本次结算总销/签约总价*固定金额*(1-交房保证金比例)
 *  =>关系户扣减：
 *    =>固定金额：关系户扣减=固定金额
 *    =>比例：关系户扣减=本次应结代理费*关系户扣减比例
 *  =>本次应结代理费=本次应结代理费-关系户扣减
 * 2、本次可结代理费
 *  =>本次可结代理费=本次应结代理费+调整值
 *  =>标准+保证金：本次可结代理费=本次应结代理费+本次结算交房保证金+调整值
 */
function calcShouldAgentCost(item, type, amount, flag = 'bz') {
  let num = 0, reduceAmount = 0
  if (item.baseAgentType == '1') {
    num = Number(item.settlementAmount) * (Number(item.baseAgentCost)/100) * (1 - Number(item.depositPer)/100)
  } else {
    num = Number(item.settlementAmount) / Number(item.totalPrice) * Number(item.baseAgentCost) * (1 - Number(item.depositPer)/100)
  }
  if (item.isAssociates) {
    reduceAmount = type == '2' ? amount : num * amount / 100
    num = num - reduceAmount
  }
  return {
    shouldAgentCost: dealPrecision(num),
    reduceAmount: dealPrecision(reduceAmount),
    actualAgentCost: flag == 'bz_bzj' ? dealPrecision(num + Number(item.settlementDepositAmount) + Number(item.adjustAmount)) : dealPrecision(num + Number(item.adjustAmount))
  }
}

/** 
 * 保证金结算-计算本次应结代理费、本次可结代理费、关系户扣减
 * =>关系户扣减：
 *   =>固定金额：关系户扣减=固定金额
 *   =>比例：关系户扣减=交房保证金*关系户扣减比例
 * =>本次应结代理费=交房保证金-关系户扣减
 * =>本次可结代理费=本次应结代理费+调整值
 */
function calcShouldAgentCost_bzj(item, type, amount) {
  let num = 0, reduceAmount = 0
  if (item.isAssociates) {
    reduceAmount = type == '2' ? amount : Number(item.depositAmount) * amount / 100
  }
  num = Number(item.depositAmount) - reduceAmount
  return {
    shouldAgentCost: dealPrecision(num),
    reduceAmount: dealPrecision(reduceAmount),
    actualAgentCost: dealPrecision(num + Number(item.adjustAmount))
  }
}



function syncData(list, item) {
  let index = list.findIndex(i => i.commissionDetailId === item.commissionDetailId)
  if (index >= 0) list.splice(index, 1, item)
}

// 处理计算精确度
function dealPrecision(num) {
  return Math.round(num * 100) / 100
}


function update(field, info, item) {
  switch (field) {
    case 'settlementAmount':
      return onSettlement(info, item);
    case 'baseAgentCost':
      return onRate(info, item);
    case 'adjustAmount':
      return onAdjust(info, item);
    case 'depositAmount':
      return onDeposit(info, item);
    case 'settlementDepositAmount':
      return onSettlementDeposit(info, item);
    default: break;
  }
}


export default {
  onAssociates,
  update,
  
  syncData,
  dealPrecision
}
